// const climbing = n => {
//     if (n == 1) return 1
//     if (n == 2) return 2
//     return climbing(n - 1) + climbing(n - 2)
// }

// const climbing = n => {
//     let array = []

//     const step = n => {
//         if (n === 1) return 1
//         if (n === 2) return 2
        
//         if (array[n] > 0) return array[n]
        
//         array[n] = step(n - 1) + step(n - 2)
//         console.log(n, array)
//         return array[n]
//     }

//     return step(5)
// }

// const climbing = n => {
//     if (n === 1) return 1
//     if (n === 2) return 2

//     let array = []
//     array[1] = 1
//     array[2] = 2

//     for (let i = 3; i <= n; i++) {
//         array[i] = array[i - 1] + array[i - 2]
//     }

//     return array[n]
// }

// console.log(climbing(10))

const arr1 = [1,2,3,[1,2,3,4, [2,3,4]]];

// function flatten(input) {
//     const stack = [...input];
//     const res = [];
//     while (stack.length) {
//       // pop value from stack
//       const next = stack.pop();
//       if (Array.isArray(next)) {
//         // push back array items, won't modify the original input
//         stack.push(...next);
//       } else {
//         res.push(next);
//       }
//     }
//     //reverse to restore input order
//     return res.reverse();
// }
const flatten = (input) => {
    const stack = [...input]
    const result = []

    while (stack.length) {
        const next = stack.pop()
        if (Array.isArray(next)) {
            stack.push(...next)
        } else {
            result.push(next)
        }
    }

    return result.reverse()
}

console.log(flatten(arr1))